home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-07-26 | 167.7 KB | 7,723 lines |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- DOS PROTECTED MODE INTERFACE (DPMI)
-
- SPECIFICATION
-
-
-
- Protected Mode API For DOS Extended Applications
-
- Version 0.9
-
- Printed July 26, 1990
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TABLE OF CONTENTS
-
-
- 1. Introduction............................................1
-
- 2. General Notes for Protected Mode Programs...............4
- 2.1 Virtual DOS Environments...........................5
- 2.1.1 No Virtualization............................5
- 2.1.2 Partial Virtualization.......................5
- 2.1.3 Complete Virtualization......................5
- 2.2 Descriptor Management..............................6
- 2.3 Interrupt Flag Management..........................7
- 2.4 Interrupts.........................................8
- 2.4.1 Hardware Interrupts..........................8
- 2.4.2 Software Interrupts..........................9
- 2.5 Virtual Memory and Page Locking...................10
-
- 3. Mode and Stack Switching...............................11
- 3.1 Stacks and Stack Switching........................12
- 3.1.1 Protected Mode Stack........................12
- 3.1.2 Locked Protected Mode Stack.................12
- 3.1.3 Real Mode Stack.............................12
- 3.1.4 DPMI Host Ring 0 Stack......................12
- 3.2 Default Interrupt Reflection......................13
- 3.3 Mode Switching....................................14
- 3.4 State Saving......................................15
-
- 4. Error Handling.........................................16
-
- 5. Loading DPMI Clients and Extended Applications.........17
- 5.1 Obtaining the Real to Protected Mode Switch Entry
- Point.................................................18
- 5.2 Calling the Real to Protected Mode Switch Entry
- Point.................................................19
-
- 6. Terminating A Protected Mode Program...................22
-
- 7. Mode Detection.........................................23
-
- 8. LDT Descriptor Management Services.....................24
- 8.1 Allocate LDT Descriptors..........................25
- 8.2 Free LDT Descriptor...............................26
- 8.3 Segment to Descriptor.............................27
- 8.4 Get Next Selector Increment Value.................28
- 8.5 Reserved Subfunctions.............................29
- 8.6 Get Segment Base Address..........................30
- 8.7 Set Segment Base Address..........................31
- 8.8 Set Segment Limit.................................32
- 8.9 Set Descriptor Access Rights......................33
- 8.10 Create Code Segment Alias Descriptor.............35
- 8.11 Get Descriptor...................................36
- 8.12 Set Descriptor...................................37
- 8.13 Allocate Specific LDT Descriptor.................38
-
-
-
-
-
-
-
-
-
-
-
-
-
- 9. DOS Memory Management Services.........................39
- 9.1 Allocate DOS Memory Block.........................40
- 9.2 Free DOS Memory Block.............................41
- 9.3 Resize DOS Memory Block...........................42
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 10. Interrupt Services....................................43
- 10.1 Get Real Mode Interrupt Vector...................44
- 10.2 Set Real Mode Interrupt Vector...................45
- 10.3 Get Processor Exception Handler Vector...........46
- 10.4 Set Processor Exception Handler Vector...........47
- 10.5 Get Protected Mode Interrupt Vector..............50
- 10.6 Set Protected Mode Interrupt Vector..............51
-
- 11. Translation Services..................................52
- 11.1 Simulate Real Mode Interrupt.....................55
- 11.2 Call Real Mode Procedure With Far Return Frame...56
- 11.3 Call Real Mode Procedure With Iret Frame.........57
- 11.4 Allocate Real Mode Call-Back Address.............58
- 11.5 Free Real Mode Call-Back Address.................62
- 11.6 Get State Save/Restore Addresses.................63
- 11.7 Get Raw Mode Switch Addresses....................65
-
- 12. Get Version...........................................66
-
- 13. Memory Management Services............................67
- 13.1 Get Free Memory Information......................68
- 13.2 Allocate Memory Block............................70
- 13.3 Free Memory Block................................71
- 13.4 Resize Memory Block..............................72
-
- 14. Page Locking Services.................................73
- 14.1 Lock Linear Region...............................74
- 14.2 Unlock Linear Region.............................75
- 14.3 Mark Real Mode Region as Pageable................76
- 14.4 Relock Real Mode Region..........................77
- 14.5 Get Page Size....................................78
-
- 15. Demand Paging Performance Tuning Services.............79
- 15.1 Reserved Subfunctions............................80
- 15.2 Mark Page as Demand Paging Candidate.............81
- 15.3 Discard Page Contents............................82
-
- 16. Physical Address Mapping..............................83
-
- 17. Virtual interrupt State Functions.....................84
- 17.1 Get and Disable Virtual Interrupt State..........85
- 17.2 Get and Enable Virtual Interrupt State...........86
- 17.3 Get Virtual Interrupt State......................87
-
- 18. Get Vendor Specific API Entry Point...................88
-
- 19. Debug Register Support................................89
- 19.1 Set Debug Watchpoint.............................90
- 19.2 Clear Debug Watchpoint...........................91
- 19.3 Get State of Debug Watchpoint....................92
- 19.4 Reset Debug Watchpoint...........................93
-
- 20. Other APIs............................................94
-
-
-
-
-
-
-
-
-
-
-
-
-
- 21. Notes For DOS Extenders...............................95
- 21.1 Initialization of Extenders.....................96
- 21.2 Installing API Extensions........................96
- 21.3 Loading the Application Program..................96
- 21.4 Providing API Extensions.........................97
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1. INTRODUCTION
-
-
- The DOS Protected Mode Interface (DPMI) was defined to allow
- DOS programs to access the extended memory of PC
- architecture computers while maintaining system protection.
- DPMI defines a specific subset of DOS and BIOS calls that
- can be made by protected mode DOS programs. It also defines
- a new interface via software interrupt 31h that protected
- mode programs use to allocate memory, modify descriptors,
- call real mode software, etc. Any operating system that
- currently supports virtual DOS sessions should be capable of
- supporting DPMI without affecting system security.
-
- Some DPMI implementations can execute multiple protected
- mode programs in independent virtual machines. Thus, DPMI
- applications can behave exactly like any other standard DOS
- program and can, for example, run in the background or in a
- window (if the environment supports these features).
- Programs that run in protected mode also gain all the
- benefits of virtual memory and can run in 32-bit flat model
- if desired.
-
- Throughout this document, the term "real mode" software is
- used to refer to code that runs in the low 1 megabyte
- address space and uses segment:offset addressing. Under
- many implementations of DPMI, so called real mode software
- is actually executed in virtual 8086 mode. However, since
- virtual 8086 mode is a very close approximation of real
- mode, we will refer to it as real mode in this document.
-
- DPMI services are only available to protected mode programs.
- Programs running in real mode can not use these services.
- Protected mode programs must use the service described on
- page 20 to enter protected mode before calling Int 31h
- services.
-
- All Int 31h functions will modify flags and the AX register.
- All other registers will be preserved unless they are
- specified as return values. Unsupported calls will return
- with the carry flag set. Since Int 31h is set up as a trap
- gate, the interrupt flag will not be modified by any Int 31h
- calls except for memory management and interrupt flag
- management calls. All memory management calls may enable
- interrupts. Interrupt flag management calls will modify the
- interrupt flag as specified by the call. All Int 31h
- services are reentrant.
-
- Some implementations of DPMI can run 32-bit 80386 specific
- programs. DPMI functions that take pointers as parameters
- will use the extended 32-bit registers for offsets (for
- example, ES:EDI instead of ES:DI) when running 32-bit mode
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 1
-
-
-
-
-
-
-
-
- programs. The high word of the 32-bit registers will be
- ignored when running 16-bit protected mode programs.
-
- DPMI services are provided by what will be referred to as
- the DPMI host program. The program(s) that use DPMI
- services are called DPMI clients. Generally, DPMI clients
- are two categories:
-
- o Extended Applications
- o Applications that use DPMI directly
-
- It is believed that most DPMI applications will be extended
- applications. Extended applications are bound with an
- extender that is the actual DPMI client and the application
- calls extender services that then are translated by the
- client into DPMI calls. The advantage of an extended
- application over one that calls DPMI services directly is
- that generally an extender will support more than just DPMI.
- In fact it is recommended that extenders look for extension
- services in the following order:
-
- o DPMI
- o VCPI/EMS
- o XMS
- o Top-down (Int 15h)
-
- An extender can provide a single set of APIs to the actual
- application and then translate them to the services that are
- provided. Where the host extension services are "lacking"
- in a particular function the extender must provide that
- function for the application.
-
- Figure 1 on page 3 shows a picture of how this works. The
- application code sits on top of a set of base extender
- functions and APIs. The extender then has separate modules
- for each type of extension service and code to "fill in the
- slack" where services are lacking. An example of a typical
- extender service is protected mode program loading. The
- actual shipped application is the application code bound in
- with the extender and all of its styles of client support.
-
- The host support is generally an extension of the base OS
- functions or a device driver used to extend the base OS
- functions.
-
- This document is intended to provide a definition of the
- DPMI services that a DPMI host would be required to
- implement and that a DPMI client would use.
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 2
-
-
-
-
-
-
-
-
-
-
- Figure 1. Application/Extender/Client/Host/OS structure
-
-
- +----------------------------------------------------------+
- | |
- | +----------------------------------------------------+ |
- | | | |
- | | Application Code | |
- | | | |
- | +----------------------------------------------------+ |
- | |
- | +----------------------------------------------------+ |
- | | Extender Base (including APIs) | |
- | | -------------------------------------------------- | |
- | | DPMI | |
- | | client | |
- | +------------+ | |
- | | VCPI | |
- | | client | |
- | +------------+ | |
- | | XMS | |
- | | client | |
- | +------------+ | |
- | | Top-down | |
- | | client | |
- | +-------------+ |
- | |
- +----------------------------------------------------------+
-
- +------------+
- | |
- | |
- | |------------+
- | | |
- | DPMI | |
- | host | VCPI |------------+
- | | | |
- | | | |
- | |------------| XMS |-------------+
- | | EMS | | Top-down |
- | | | | (Int 15h) |
- +----------------------------------------------------+
-
- +----------------------------------------------------+
- | |
- | Operating System (e.g. DOS) |
- | |
- +----------------------------------------------------+
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 3
-
-
-
-
-
-
-
-
-
- 2. GENERAL NOTES FOR PROTECTED MODE PROGRAMS
-
-
- There are a few basic differences between real mode and
- protected mode that need to be addressed to convert a real
- mode program to run in protected mode.
-
- Programs run at a protection level that prevents them from
- executing privileged instructions such as lgdt, lidt, etc.
- The DPMI interface is the only method application programs
- have for modifying system structures such as descriptors.
-
- While DPMI defines a specific set of functions that will be
- supported by all implementations, there may be minor
- differences in individual implementations. Programmers
- should refer to the notes for their DPMI implementation for
- documentation on detecting the presence of and calling
- vendor specific extensions. However, any application that
- is written to adhere only to standard DPMI calls should work
- correctly under all implementations of DPMI.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 4
-
-
-
-
-
-
-
-
-
- 2.1 Virtual DOS Environments
-
-
- Many DPMI implementations are simulated "virtual DOS"
- sessions. In other words, the DOS interface and environment
- presented to the program are not actually the native
- interface of the operating system. Hardware interrupts,
- I/O, and processor exceptions will be virtualized by the
- operating system. This means, for example, that a DPMI
- program may receive a simulated keyboard interrupt and read
- simulated I/O from the keyboard controller ports.
-
- In these environments, actual hardware interrupts will be
- handled by the operating system. The physical interrupts
- will be invisible to the DPMI application program. If the
- operating system so chooses, it may reflect a virtual
- interrupt to the DPMI program. The DPMI program does not
- need to know, nor should it care, if this is the case. From
- the program's point of view, the interrupt looks exactly
- like a "real" interrupt. The operating system will also
- virtualize I/O to the interrupt controller ports and any
- other simulated devices.
-
- There are basically three levels of virtualization that DPMI
- implementations can provide:
-
- 2.1.1 No Virtualization
-
- In general, stand-alone single tasking DPMI implementations
- will not virtualize any hardware devices. These hose
- extension programs will execute as standard DOS real mode
- drivers or programs. Extenders which use the services
- provided by these DPMI host drivers will translate protected
- mode DOS calls to real mode DOS calls. Normally these
- extenders will invoke DPMI services to return the processor
- to real mode (instead of virtual 8086 mode) when calling
- DOS.
-
- 2.1.2 Partial Virtualization
-
- Some environments that execute under DOS will virtualize
- hardware devices, provide virtual memory, or provide other
- services that require virtualization of some hardware
- devices. Under these environments, DPMI applications will
- always run at a non-privileged ring (usually ring 3). Some
- or all hardware interrupts will be virtualized, some or all
- I/O will be virtualized, and virtual memory may be
- supported. Under these implementations, page locking
- services usually must be used to lock interrupt and
- exception handling code.
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 5
-
-
-
-
-
-
-
-
- 2.1.3 Complete Virtualization
-
- These environments provide a completely simulated DOS
- environment. The native operating system is something other
- than MS-DOS. Under these implementations of DPMI, all
- devices will be virtualized to some extent. Normally, page
- locking services will be ignored by these implementations
- since all physical device interrupt and I/O handling will be
- performed by the operating system. Programs will always run
- at a non-privileged ring.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 6
-
-
-
-
-
-
-
-
-
- 2.2 Descriptor Management
-
-
- Protected mode code segments can not be modified. This
- requires programs to allocate an alias data descriptor if
- they need to store data in a code segment.
-
- Segment arithmetic that works in real mode does not work in
- protected mode.
-
- Some calls will return a range of descriptors. For example,
- if a 16-bit mode program allocates a block of memory larger
- than 64K, the call will allocate several, contiguous
- descriptors. Each descriptor will have a 64K limit except
- for the final descriptor which will have a limit that
- contains the remainder of the block. The call will return
- the first selector in the array. To get to the next
- selector, your program must add the value returned by Int
- 31h call 0003h (see page 32).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 7
-
-
-
-
-
-
-
-
-
- 2.3 Interrupt Flag Management
-
-
- The popf and iret instructions may not modify the state of
- the interrupt flag since most DPMI implementations will run
- programs with IOPL < DPL. Programs must execute cli or sti
- to modify the interrupt flag state.
-
- This means that the following code sequence will leave
- interrupts disabled:
-
- ;
- ; (Assume interrupts are enabled at this point)
- ;
- pushf
- cli
- .
- .
- popf ; Interrupts are still OFF!
-
- Note that since some implementations of DPMI will maintain a
- virtual interrupt state for protected mode DOS programs, the
- current value of the interrupt flag may not reflect the
- current virtual interrupt state. Protected mode programs
- should use the virtual interrupt state services to determine
- the current interrupt flag state (see page 99).
-
- Since cli and sti are privileged instructions, they will
- cause a protection violation and the DPMI provider will
- simulate the instruction. Because of the overhead involved
- in processing the exception, cli and sti should be used as
- little as possible. In general, you should expect either of
- these instructions to require at least 300 clocks.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 8
-
-
-
-
-
-
-
-
-
- 2.4 Interrupts
-
-
- Protected mode programs can hook both hardware and software
- interrupts using the DPMI get and set protected mode
- interrupt vector functions (see page 56). All interrupts
- from hardware devices such as the timer or keyboard
- controller will always be reflected to the protected mode
- interrupt handler first. If the protected mode handler
- jumps to or calls the previous interrupt handler then the
- interrupt will be reflected to real mode.
-
- As in real mode, interrupt procedures can either service the
- interrupt and iret or they can chain to the next handler in
- the interrupt chain by executing pushf/call or by jumping to
- the next handler. The final handler for all protected mode
- interrupts will reflect the interrupt to real mode.
-
- When an interrupt is reflected to real mode, the EAX, EBX,
- ECX, EDX, ESI, EDI, EBP registers, and flags will all be
- passed from protected to real mode unaltered. The segment
- registers will contain undefined values unless an API
- translator (such as a DOS or BIOS translator) explicitly
- sets a real mode segment register. DPMI will automatically
- provide a real mode stack for interrupts that are reflected
- to real mode.
-
-
- 2.4.1 Hardware Interrupts
-
- The interrupt controllers are mapped to the system's default
- interrupts. On an IBM AT-compatible system, for example,
- the master interrupt controller is programmed with a base
- interrupt of 8 and the slave controller has a base of 70h.
- The virtualized interrupt controllers can be reprogrammed;
- the base setting may be examined in protected mode with Int
- 31h function 0400h.
-
- Hardware interrupt procedures and all of their data must
- reside in locked memory. All memory that is touched by
- hardware interrupt hooks must be locked. The handler will
- always be called on a locked stack. See page 12 for more
- details.
-
- As in real mode, hardware interrupt handlers are called with
- interrupts disabled. Since iret will not restore the
- interrupt flag, hardware interrupt hooks must execute an sti
- before executing iret or else interrupts will remain
- disabled.
-
- Protected mode hardware interrupt handlers will always be
- called even for interrupts that occur in real mode. The
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 9
-
-
-
-
-
-
-
-
- last hook on the protected mode interrupt chain will reflect
- the interrupt to real mode.
-
- Protected mode hardware interrupt handlers that need to call
- software running in real mode must either be sure that the
- real mode software that they are calling will not modify
- segment registers or they must use the state save service
- (see page 74) to save and restore the real mode segment
- registers. However, any interrupt handler that executes
- completely in protected mode, or uses translation services
- 0300h, 0301h, or 0302h does not need to save the real mode
- register state. Therefore, this is not an issue for most
- interrupt handlers.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 10
-
-
-
-
-
-
-
-
- For compatibility with older systems, computers with two
- interrupt controllers have the BIOS redirect one of the
- interrupts from the slave controller into the range of the
- master controller. For example, devices jumpered for IRQ 2
- on IBM AT-compatible computers actually interrupt on IRQ 9
- (interrupt 71h). In real mode, the BIOS on these systems
- will convert interrupt 71h to Int 0Ah and EOI the slave
- controller. A protected mode program that needs access to
- the redirected interrupt may use variations on either of
- these techniques:
-
- 1. Hook the target interrupt in real mode. This
- takes advantage of the built in redirection. This
- is robust on systems where other software has
- reprogrammed the interrupt controllers, or where
- the slave interrupt controller may be absent.
-
- 2. Hook the actual interrupt in both real and
- protected mode. In this case, the program must
- EOI both the slave and master interrupt
- controllers since the BIOS will not get control.
- This is more efficient in that there will not be
- any unnecessary switches to real mode.
-
- 2.4.2 Software Interrupts
-
- Most software interrupts executed in real mode will not be
- reflected to the protected mode interrupt hooks. However,
- some software interrupts are also reflected to protected
- mode programs when they are called in real mode. These are:
-
-
- INT DESCRIPTION
-
- 1Ch BIOS timer tick interrupt
- 23h DOS Ctrl+C interrupt
- 24h DOS critical error interrupt
-
-
- Programs should not terminate during interrupts that were
- reflected from real mode. Terminating the program at this
- point may prevent the DPMI host from cleaning up properly.
-
- Of all software interrupts, only Ints 00h-07h will be called
- with virtual interrupts disabled. For these interrupts, the
- handler should return with interrupts enabled. All other
- interrupts will not modify the interrupt flag state.
-
- Since most software interrupts that are executed in real
- mode are not reflected to protected mode interrupt hooks,
- programs would be required to install a real mode interrupt
- hook to monitor these interrupts.
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 11
-
-
-
-
-
-
-
-
-
- 2.5 Virtual Memory and Page Locking
-
-
- Many implementations of DPMI support virtual memory. In
- these environments, it will be necessary to lock any memory
- that can be touched while executing inside of DOS. This is
- necessary because it may not be possible for the operating
- system to demand load a page if DOS is busy.
-
- Some DPMI implementations will not call DOS to read or write
- virtual memory to disk and under these implementations the
- page locking services may be ignored. Since the entire DPMI
- session is virtualized, a page fault can be handled at any
- point while executing the program. However, under all
- implementations, DPMI applications should lock interrupt
- code and data. The lock calls will always return success
- under implementations that ignore these calls.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 12
-
-
-
-
-
-
-
-
-
- 3. MODE AND STACK SWITCHING
-
-
- This section contains an overview of how DPMI hosts switch
- between protected and real mode and handle stack switching.
- It is important to understand the host maintains the state
- of the client to prevent overwriting stack data or modifying
- segment registers.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 13
-
-
-
-
-
-
-
-
-
- 3.1 Stacks and Stack Switching
-
-
- Every DPMI task runs on four different stacks: An
- application ring protected mode stack, a locked protected
- mode stack, a real mode stack, and a DPMI host ring 0 stack.
-
- The protected mode stack is the one the DPMI client was
- running on when it switched into protected mode by calling
- the protected mode entry point (although the client can
- switch to another protected mode stack if desired). The
- locked protected mode stack is provided by the DPMI server
- and is used for simulating hardware interrupts and
- processing real mode call-backs. The DPMI host provides the
- real mode stack, which is usually located in the data area
- provided by the client. The ring 0 stack is only accessible
- by the DPMI host. However, this stack may contain state
- information about the currently running program.
-
-
- 3.1.1 Protected Mode Stack
-
- This is the stack that the client uses for normal execution
- in protected mode. The protected mode stack of a DPMI
- client can be unlocked if desired. Software interrupts
- executed in protected mode will be reflected on this stack.
-
- 3.1.2 Locked Protected Mode Stack
-
- During hardware interrupts, Int 1Ch, Int 23h, Int 24h,
- exceptions, and real mode call-back handling in protected
- mode, the DPMI will host automatically switch to a locked
- protected mode stack. When the interrupt or call returns,
- the host will return to the original protected mode stack.
- Note that there is only one, 4K, locked stack provided by
- the host. The stack will be switched onto the first time an
- interrupt or call is reflected to protected mode, and will
- be switched away from when the client returns. Subsequent
- nested interrupts or calls will not cause a stack switch.
- Software interrupts do not automatically switch stacks.
-
- 3.1.3 Real Mode Stack
-
- The DPMI host will provide the client with a real mode stack
- that is at least 200h bytes in size and will always be
- locked. Interrupts that are reflected into real mode, as
- well as calls made using the translation services, will be
- reflected on this stack. DPMI hosts will not automatically
- switch stacks for hardware interrupt processing in real mode
- since DOS performs this function automatically.
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 14
-
-
-
-
-
-
-
-
- 3.1.4 DPMI Host Ring 0 Stack
-
- DPMI hosts will normally have a stack associated with each
- DPMI task. The DPMI client will not be able to access this
- stack in any way -- it is used by the host for execution at
- ring 0 to handle interrupts and exceptions. This stack will
- sometimes be used to store state information while switching
- modes. For example, the original SS:ESP of the protected
- mode program could be saved on the ring 0 stack while the
- DPMI host switches onto the locked protected mode stack.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 15
-
-
-
-
-
-
-
-
-
- 3.2 Default Interrupt Reflection
-
-
- DPMI hosts provide interrupt vectors for all 100h (256
- decimal) interrupts for protected mode clients. When the
- DPMI client initializes, all interrupt vectors will point to
- code that will automatically reflect the interrupt to real
- mode (except for Int 31h and Int 21h, AH=4Ch). When a
- default interrupt reflection handler is executed it will
- switch to real mode, preserving the EAX, EBX, ECX, EDX, ESI,
- EDI, and EBP registers and flags, and reflect the interrupt
- in real mode. When the real mode interrupt returns, the
- default interrupt reflection code will switch back to
- protected mode and return with the modified values of EAX,
- EBX, ECX, EDX, ESI, EDI, EBP, and flags. Segment registers
- and the stack pointer will not be passed between modes.
- Therefore, any API that passes pointers or information in
- segment registers will need to be translated by a DOS
- extender.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 16
-
-
-
-
-
-
-
-
-
- 3.3 Mode Switching
-
-
- There are three different ways a client can force a mode
- switch between protected and real mode:
-
- o Execute the default interrupt reflection handler
- o Use the translation services to call real mode
- code
- o Use a real mode call-back to switch from real to
- protected mode
- o Use the raw mode switch functions
-
- All mode switches except for the raw mode switches will save
- some information on the DPMI host's ring 0 stack. This
- means that programs should not terminate while in nested
- mode switches unless they are using the raw mode switching
- services. However, even programs that use raw mode switches
- should not attempt to terminate from a hardware interrupt or
- exception handler since the DPMI host performs automatic
- mode and stack switching to provide these services.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 17
-
-
-
-
-
-
-
-
-
- 3.4 State Saving
-
-
- Because DPMI hosts switch stacks automatically across mode
- switches, it is sometimes necessary to use the state
- save/restore functions while using the raw mode switch
- services. The host will maintain information on the "other"
- mode's current state. This information will include the
- CS:(E)IP, SS:(E)SP, and segment register values. Since the
- DPMI client has no way to directly access these values, it
- will need to call the state saving functions when performing
- nested mode switches.
-
- For example, during hardware interrupts, the DPMI host will
- preserve the real mode's segment registers, CS:EIP, and
- SS:ESP on the ring 0 stack. However, they are not pushed on
- any stack in the VM -- They are only visible at ring 0.
- When the raw mode switch functions are called they will
- overwrite the information saved by the host. At this point,
- the program would return to the wrong address when the
- interrupt returned. For more information on state saving,
- refer to the documentation on page 74.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 18
-
-
-
-
-
-
-
-
-
- 4. ERROR HANDLING
-
-
- Most Int 31h calls can fail. The DPMI 0.9 specification
- does not specify error return codes for most calls. When a
- call fails it will set the carry flag and return with the
- value in AX unmodified unless otherwise specified. However,
- future DPMI implementations will return error codes in the
- AX register. All specific error codes will have the high
- bit (bit 15) set. If a function returns with carry set and
- the high bit of AX clear, it should be treated as a general
- failure. Specific error codes will allow programs running
- under future DPMI implementations to take appropriate
- corrective action in some cases.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 19
-
-
-
-
-
-
-
-
-
- 5. LOADING DPMI CLIENTS AND EXTENDED APPLICATIONS
-
-
- All DPMI applications begin execution in real mode. An
- application must run first as a standard real mode DOS
- program but it can switch to protected execution by making a
- few simple calls.
-
- DPMI does not define an executable file format for protected
- mode programs. Instead, programs must provide their own
- mechanism for loading and fixing up protected mode code.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 20
-
-
-
-
-
-
-
-
-
- 5.1 Obtaining the Real to Protected Mode Switch Entry
- Point
-
-
- This function can be called in real mode to detect the
- presence of DPMI services and to obtain an address that
- can be used to begin execution in protected mode.
-
- To Call
-
- AX = 1687h
- Execute an Int 2Fh (not an Int 31h)
-
- Returns
-
- If function was successful:
- AX = 0
- BX = Flags
- Bit 0 = 1 if 32-bit programs are supported
- CL = Processor type
- 02h = 80286
- 03h = 80386
- 04h = 80486
- DH = DPMI major version number
- DL = DPMI minor version number
- SI = Number of paragraphs required for DPMI host
- private data (may be 0)
- ES:DI = Address of procedure to call to enter protected
- mode
-
- If function was not successful:
- AX != 0
-
- Programmer's Notes
-
- o This function does not perform the actual
- transition into protected mode. You need to call
- the address returned in ES:DI, after allocating
- the private data area for the DPMI host, to
- perform the actual real to protected mode switch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 21
-
-
-
-
-
-
-
-
-
- 5.2 Calling the Real to Protected Mode Switch Entry Point
-
-
- After using Int 2Fh function 1687h, to obtain the
- protected mode entry point, the DPMI client must call
- the entry point address as described in this section.
-
- To Call
-
- AX = Flags
- Bit 0 = 1 if program is a 32-bit application
- ES = Real mode segment of DPMI host data area. This
- must be the size of the data area returned in SI
- from the previous function. ES will be ignored if
- the required data size is zero.
- Call the address returned in ES:DI by the previous
- function
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- Program is now executing in protected mode.
- CS = 16-bit selector with base of real mode CS and a
- 64K limit
- SS = Selector with base of real mode SS and a 64K limit
- DS = Selector with base of real mode DS and a 64K limit
- ES = Selector to program's PSP with a 100h byte limit
- FS and GS = 0 (if running on an 80386 or 80486)
- If the program is a 32-bit application the high word of
- ESP will be 0
- All other registers are preserved
-
- If function was not successful:
- Carry flag is set.
- Program is executing in real mode
-
- Programmer's Notes
-
- o Once in protected mode, all Int 31h calls that are
- supported by DPMI can be called.
- o To terminate the program, execute an Int 21h with
- AH=4Ch and AL=Error code. This is the standard
- DOS exit function. Do not use any other DOS
- termination call -- Only AH=4Ch is supported under
- DPMI.
- o Under different implementations of DPMI the
- privilege ring of a program will change. Programs
- should make no assumptions about the ring at which
- they will run. When creating descriptors,
- programs should set the DPL of the descriptor to
- the same ring as their initial code segment. Use
- the lar instruction to determine the protection
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 22
-
-
-
-
-
-
-
-
- ring of your program's code segment. All
- descriptors created by your program should be set
- to the same protection level.
- o Programs that specify that they are 32-bit
- applications will initially run with a 16-bit code
- segment. Stack and data selectors for 32-bit
- programs will be 32-bit (the Big bit will be set).
- However, all Int 31h calls will require 48-bit
- pointers even though the program is running in a
- 16-bit code segment.
- o Unless you have explicitly enabled the A20 address
- line through the XMS interface, do not assume that
- memory from 1Mb to 1Mb+64K-16 (the High Memory
- Area) is addressable once your program is running
- in protected mode. If you want to be able to
- access the HMA then you must enable the A20
- through XMS before entering protected mode. XMS
- calls are not supported in protected mode. Note
- that this restriction is only important for
- software that wishes to access the HMA. Under all
- implementations of DPMI the physical A20 address
- line will always be enabled while executing
- protected mode code. However, some 80386 specific
- DPMI implementations simulate 1Mb address wrap for
- compatibility reasons. Under these DPMI
- implementations, the HMA will not be accessible
- unless the A20 is enabled through the XMS
- interface.
- o The environment pointer in the current program's
- PSP will automatically be converted to a
- descriptor. If you want to free the program's
- environment memory, you must do so before entering
- protected mode. In this case, the environment
- pointer descriptor will point to garbage and
- should not be used. The DPMI client may change
- the environment pointer in the PSP after entering
- protected mode but it must restore it to the
- selector created by the DPMI host before
- terminating.
- o The caller is allowed to modify or free the DS,
- SS, and CS descriptors allocated by this call.
- You may not modify the PSP descriptor or
- environment pointer descriptor in the PSP. See
- page 30 for information on freeing descriptors.
- o Note that if DS=SS on entry to this call then only
- one descriptor will be allocated for both DS and
- SS. In this case, for example, if you changed the
- base of the DS descriptor you would also change
- the base of the stack segment.
- o For some hosts it may be a good idea for protected
- mode programs to use some or all of the real mode
- memory allocated to the real mode program by DOS
- for protected mode code or data. Protected mode
- programs that use memory in the first 1Mb should
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 23
-
-
-
-
-
-
-
-
- mark the memory as pageable using Int 31h 0602h.
- See page 90 for details.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 24
-
-
-
-
-
-
-
-
- Example Code
-
- ;
- ; Get the entry point address and save it
- ;
- mov ax, 1687h
- int 2Fh
- test ax, ax
- jnz Cant_Enter_PMode
- mov [PMode_Entry_Seg], es
- mov [PMode_Entry_Off], di
-
- ;
- ; Allocate memory for use by DOS extender if necessary
- ; NOTE: This code assumes that the program has already
- ; shrunk its memory block so that the DOS
- ; memory allocation call will work
- ;
- test si, si
- jz Enter_PMode_Now
- mov bx, si
- mov ah, 48h
- int 21h
- jc Cant_Enter_PMode
- mov es, ax
-
- ;
- ; Enter protected mode as a 16-bit program
- ;
- Enter_PMode_Now:
- xor ax, ax
- call DWORD PTR [PMode_Entry_Off]
- jc Cant_Enter_PMode
-
- ;
- ; The program is running in protected mode now!
- ; Protected mode initialization code would go here.
- ; Mark program's real mode memory as pageable, etc.
- ;
- .
- .
- .
-
- ;
- ; Quit the program and return to real mode DOS
- ;
- mov ax, 4C00h
- int 21h
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 25
-
-
-
-
-
-
-
-
-
- 6. TERMINATING A PROTECTED MODE PROGRAM
-
-
- To terminate a protected mode program execute an Int 21h
- with AH=4Ch in protected mode. You can return an error code
- in the AL register. This is the standard DOS terminate API
- but it must be executed in protected mode to allow the DPMI
- host to clean up any data structures associated with the
- protected mode program.
-
- Programs should not be terminated from a hardware interrupt,
- exception handler, or real mode call-back. Programs should
- only be terminated from their main thread of execution to
- allow the DPMI host to clean up properly. However, DOS
- extenders that use the raw mode switch services for all mode
- transitions can execute the terminate call after switching
- from real to protected mode.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 26
-
-
-
-
-
-
-
-
-
- 7. MODE DETECTION
-
-
- It is possible to write a program or library that can run in
- either real or protected mode. This function is supplied so
- that bimodal code can detect at run time whether it is
- running under protected mode. Code that only runs in
- protected mode does not need to perform this test.
-
- To Call
-
- AX = 1686h
- Execute an Int 2Fh (not an Int 31h)
-
- Returns
-
- If executing in protected mode under DPMI:
- AX = 0
-
- If executing in real mode or not under DPMI then:
- AX != 0
-
- Programmer's Notes
-
- o This call will return AX = 0 when the caller is
- running in protected mode. It will return AX non-
- zero even when running under environments that
- support DPMI if the caller is in real (virtual
- 8086) mode. See page 20 for information on
- entering protected mode.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 27
-
-
-
-
-
-
-
-
-
- 8. LDT DESCRIPTOR MANAGEMENT SERVICES
-
-
- The LDT descriptor management services provide interfaces
- for allocating, freeing, creating, locking and unlocking
- protected mode descriptors in the current task's Local
- Descriptor Table (LDT).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 28
-
-
-
-
-
-
-
-
-
- 8.1 Allocate LDT Descriptors
-
-
- This function is used to allocate one or more
- descriptors from the task's Local Descriptor Table
- (LDT). The descriptor(s) allocated must be initialized
- by the application.
-
- To Call
-
- AX = 0000h
- CX = Number of descriptors to allocate
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- AX = Base selector
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o If more than one descriptor was requested, AX will
- contain the first of a contiguous array of
- descriptors. You should add the value returned by
- function 0003h (see page 32) to get to the next
- selector in the array.
- o The descriptor will be set to present data type,
- with a base and limit of zero.
- o It is up to the caller to fill in the descriptors.
- o The privilege level of descriptors will match the
- application's code segment privilege level. When
- modifying descriptors, always set the DPL to the
- same privilege ring as your program's code
- segment. Use the lar instruction to determine the
- privilege of a descriptor.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 29
-
-
-
-
-
-
-
-
-
- 8.2 Free LDT Descriptor
-
-
- This function is used to free descriptors that were
- allocated through the Allocate LDT Descriptors
- function.
-
- To Call
-
- AX = 0001h
- BX = Selector to free
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o Arrays of descriptors are freed by calling this
- function for each of the individual descriptors.
- o It is valid to free the descriptors allocated for
- the program's initial CS, DS, and SS. Other
- descriptors that were not allocated by function
- 0000h should never be freed by this function
- unless otherwise specified.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 30
-
-
-
-
-
-
-
-
-
- 8.3 Segment to Descriptor
-
-
- This function is used to convert real mode segments
- into descriptors that are addressable by protected mode
- programs.
-
- To Call
-
- AX = 0002h
- BX = Real mode segment address
-
- Returns
-
-
- If function was successful:
- Carry flag is clear.
- AX = Selector mapped to real mode segment
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o Multiple calls to this function with the same
- segment will return the same selector.
- o Descriptors created by this function should never
- be modified or freed. For this reason, you should
- use this function sparingly. If your program
- needs to examine various real mode addresses using
- the same selector you should allocate a descriptor
- and change the base using the Set Segment Base
- Address function instead of using this function.
- o The descriptor's limit will be set to 64K.
- o The intent of this function is to allow programs
- easy access to commonly used real mode segments
- such as 40h and A000h. Do not use this service to
- obtain descriptors to private data areas.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 31
-
-
-
-
-
-
-
-
-
- 8.4 Get Next Selector Increment Value
-
-
- Some functions such as allocate LDT descriptors and
- allocate DOS memory can return more than one
- descriptor. You must call this function to determine
- the value that must be added to a selector to access
- the next descriptor in the array.
-
- To Call
-
- AX = 0003h
-
- Returns
-
- Carry flag clear (this function always succeeds)
- AX = Value to add to get to next selector
-
- Programmer's Notes
-
- o Do not make any assumptions about the value this
- function will return.
- o The increment value returned will be a power of
- two.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 32
-
-
-
-
-
-
-
-
-
- 8.5 Reserved Subfunctions
-
-
- Functions 0004h and 0005h are reserved and should not be
- called.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 33
-
-
-
-
-
-
-
-
-
- 8.6 Get Segment Base Address
-
-
- This function returns the 32-bit linear base address of
- the specified segment.
-
- To Call
-
- AX = 0006h
- BX = Selector
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- CX:DX = 32-bit linear base address of segment
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 34
-
-
-
-
-
-
-
-
-
- 8.7 Set Segment Base Address
-
-
- This function changes the 32-bit linear base address of
- the specified selector.
-
- To Call
-
- AX = 0007h
- BX = Selector
- CX:DX = 32-bit linear base address for segment
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid.
- o Your program should only modify descriptors that
- were allocated through the Allocate LDT
- Descriptors function.
- o The high 8 bits of the base address (contained in
- CH) will be ignored by 16-bit implementations of
- DPMI. This is true even when running on 80386
- machines.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 35
-
-
-
-
-
-
-
-
-
- 8.8 Set Segment Limit
-
-
- This function sets the limit for the specified segment.
-
- To Call
-
- AX = 0008h
- BX = Selector
- CX:DX = 32-bit segment limit
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid or the specified limit could not
- be set. 16-bit DPMI implementations can not set
- segment limits greater than 0FFFFh (64K) so CX
- must be zero when calling this function under
- these implementations of DPMI.
- o Segment limits greater than 1 meg must be page
- aligned. That is, limits greater than one
- megabyte must have the low 12 bits set.
- o Your program should only modify descriptors that
- were allocated through the Allocate LDT
- Descriptors function.
- o To get the limit of a segment you should use the
- instruction lsl (load segment limit) which is
- supported on 80286 and 80386 machines. Note that
- on 80386 machines you will need to use the 32-bit
- form of lsl if the segment has a limit greater
- than 64K.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 36
-
-
-
-
-
-
-
-
-
- 8.9 Set Descriptor Access Rights
-
-
- This function allows a protected mode program to modify
- the access rights and type fields of a descriptor.
-
- To Call
-
- AX = 0009h
- BX = Selector
- CL = Access rights/type byte
- CH = 80386 extended access rights/type byte (32-bit
- DPMI implementations only)
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid.
- o Your program should only modify descriptors that
- were allocated through the Allocate LDT
- Descriptors function.
- o To examine the access rights of a descriptor you
- should use the instruction lar (load access
- rights) which is supported on 80286 and 80386
- machines.
- o The access rights/type byte passed in CL has the
- following format:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 37
-
-
-
-
-
-
-
-
-
- +-------------------------------+
- | P | DPL | 1 |C/D|E/C|W/R| A |
- +-------+-----------------------+
- | | | | | | +- 0=>Not Accessed
- | | | | | | 1=>Accessed
- | | | | | +-- Data: 0=>Read,
- 1=>R/W
- | | | | | Code: Must
- be 1 (readable)
- | | | | +-- Data: 0=>Exp-up, 1=>Exp-
- dn
- | | | | Code: Must be 0
- (non-conform)
- | | | +-- 0=>Data, 1=>Code
- | | |
- | | +-- Must be 1
- | |
- | +-- Must equal caller's CPL
- |
- +- 0=>Absent, 1=>Present
-
- A parameter which does not meet the above
- requirements is invalid, and causes the function
- to return with the carry flag set.
-
- o 16-bit DPMI implementations will ignore the
- extended access rights/type byte passed in CH even
- if it is running on an 80386 system. 32-bit DPMI
- implementations interpret the CH parameter as
- follows:
-
- +-------------------------------+
- | G |B/D| 0 |Avl| Reserved |
- +-----------------------+-------+
- | | | | +-- Ignored
- | | | +-- Can be 0 or 1
- | | +-- Must be 0
- | +-- 0=>Default 16-bit, 1=>Default 32-bit
- +- 0=>Byte Granular, 1=>Page Granular
-
- A parameter which does not meet the above
- requirements is invalid, and causes the function
- to return with the carry flag set.
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 38
-
-
-
-
-
-
-
-
-
- 8.10 Create Code Segment Alias Descriptor
-
-
- This function will create a data descriptor that has
- the same base and limit as the specified code segment
- descriptor.
-
- To Call
-
- AX = 000Ah
- BX = Code segment selector
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- AX = New data selector
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is not a code segment or is invalid.
- o Use the Free LDT Descriptor function to deallocate
- the alias descriptor.
- o The code segment alias descriptor will not track
- changes to the code descriptor. In other words,
- if an alias descriptor is created, and then the
- base or limit of the code segment is changed, the
- alias descriptor's base or limit would not change.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 39
-
-
-
-
-
-
-
-
-
- 8.11 Get Descriptor
-
-
- This function copies the descriptor table entry for a
- specified descriptor into an eight byte buffer.
-
- To Call
-
- AX = 000Bh
- BX = Selector
- ES:(E)DI = Pointer to an 8 byte buffer to receive copy
- of descriptor
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- ES:(E)DI = Pointer to buffer that contains descriptor
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid or unallocated.
- o 32-bit programs must use ES:EDI to point to the
- buffer. 16-bit programs should use ES:DI.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 40
-
-
-
-
-
-
-
-
-
- 8.12 Set Descriptor
-
-
- This function copies an eight byte buffer into the LDT
- entry for a specified descriptor.
-
- To Call
-
- AX = 000Ch
- BX = Selector
- ES:(E)DI = Pointer to an 8 byte buffer that contains
- descriptor
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is invalid.
- o Your program should only modify descriptors that
- were allocated through the Allocate LDT
- Descriptors function.
- o 32-bit programs must use ES:EDI to point to the
- buffer. 16-bit programs should use ES:DI.
- o The type byte (byte 5) follows the same format and
- restrictions as the access rights/type parameter
- (in CL) to Set Descriptor Access Rights. The
- extended type byte (byte 6) follows the same
- format and restrictions as the extended access
- rights/type parameter (in CH) to Set Descriptor
- Access Rights, except the limit field may have any
- value, except the low order 4 bits (marked
- "reserved") are used to set the upper 4 bits of
- the descriptor's limit.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 41
-
-
-
-
-
-
-
-
-
- 8.13 Allocate Specific LDT Descriptor
-
-
-
-
- This function attempts to allocate a specific LDT
- descriptor.To Call
-
- AX = 000Dh
- BX = Selector
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- Descriptor has been allocated
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function will fail if the selector specified
- in BX is in use or is not an LDT selector.
- o Use function 0001h to free the descriptor.
- o The first 10h (16 decimal) descriptors must be
- reserved for this function and may not be used by
- the host.
- o If another application has already loaded then
- some of these descriptors may be in use.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 42
-
-
-
-
-
-
-
-
-
- 9. DOS MEMORY MANAGEMENT SERVICES
-
-
- Some applications require the ability to allocate memory in
- the real mode addressable 1 megabyte region. These services
- allow protected mode applications to allocate and free
- memory that is directly addressable by real mode software
- such as networks and DOS device drivers. Often, this memory
- is used in conjunction with the API translation services to
- call real mode software that is not directly supported by
- DPMI.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 43
-
-
-
-
-
-
-
-
-
- 9.1 Allocate DOS Memory Block
-
-
- This function will allocate a block of memory from the
- DOS free memory pool. It returns both the real mode
- segment and one or more descriptors that can be used by
- protected mode applications to access the block.
-
- To Call
-
- AX = 0100h
- BX = Number of paragraphs (16 byte blocks) desired
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- AX = Initial real mode segment of allocated block
- DX = Selector for allocated block
-
- If function was not successful:
- Carry flag is set.
- AX = DOS error code:
- 07h memory control blocks damaged
- 08h insufficient memory available to allocate as
- requested
- BX = Size of largest available block in paragraphs
-
- Programmer's Notes
-
- o If the size of the block requested is greater than
- 64K bytes (BX > 1000h) then contiguous descriptors
- will be allocated. To access the next descriptor
- for the memory block add the value return by
- function 0003h (see page 32) to the base selector.
- If more than one descriptor is allocated under 32-
- bit DPMI implementations, the limit of the first
- descriptor will be set to the size of the entire
- block. All subsequent descriptors will have a
- limit of 64K except for the final descriptor which
- will have a limit of Block size MOD 64K. 16-bit
- DPMI implementations will always set the limit of
- the first descriptor to 64K even when running on
- an 80386.
- o Your program should never modify or deallocate any
- descriptors allocated by this function. The Free
- DOS Memory Block function will deallocate the
- descriptors automatically
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 44
-
-
-
-
-
-
-
-
-
- 9.2 Free DOS Memory Block
-
-
- This function frees memory that was allocated through
- the Allocate DOS Memory Block function.
-
- To Call
-
- AX = 0101h
- DX = Selector of block to free
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
- AX = DOS error code:
- 07h memory control blocks damaged
- 09h incorrect memory segment specified
-
- Programmer's Notes
-
- o All descriptors allocated for the memory block are
- automatically freed and therefore should not be
- accessed once the block is freed by this function.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 45
-
-
-
-
-
-
-
-
-
- 9.3 Resize DOS Memory Block
-
-
- This function is used to grow or shrink a memory block
- that was allocated through the Allocate DOS Memory
- Block function.
-
- To Call
-
- AX = 0102h
- BX = New block size in paragraphs
- DX = Selector of block to modify
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
- AX = DOS error code:
- 07h memory control blocks damaged
- 08h insufficient memory available to allocate as
- requested
- 09h incorrect memory segment specified
- BX = Maximum block size possible in paragraphs
-
- Programmer's Notes
-
- o Growing a memory block is often likely to fail
- since other DOS block allocations will prevent
- increasing the size of the block. Also, if the
- size of a block grows past a 64K boundary then the
- allocation will fail if the next descriptor in the
- LDT is not free. Therefore, this function is
- usually only used to shrink a block.
- o Shrinking a block may cause some descriptors that
- were previously allocated to the block to be
- freed. For example shrinking a block from 140K to
- 120K would cause the third allocated descriptor to
- be freed since it is no longer valid. The initial
- selector will remain unchanged, however, the
- limits of the remaining two descriptors will
- change: the first to 120K and the second to 56k.
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 46
-
-
-
-
-
-
-
-
-
- 10. INTERRUPT SERVICES
-
-
- These services allow protected mode applications to
- intercept real and protected mode interrupts and hook
- processor exceptions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 47
-
-
-
-
-
-
-
-
-
- 10.1 Get Real Mode Interrupt Vector
-
-
- This function returns the value of the current task's
- real mode interrupt vector for the specified interrupt.
-
- To Call
-
- AX = 0200h
- BL = Interrupt number
-
- Returns
-
- Carry flag is clear.
- CX:DX = Segment:Offset of real mode interrupt handler
-
- Programmer's Notes
-
- o The address returned in CX is a segment, not a
- selector. Therefore you should not attempt to
- place the value returned in CX into a segment
- register in protected mode or a general protection
- fault may occur.
- o Note all 100h (256 decimal) interrupt vectors must
- be supported by the DPMI host.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 48
-
-
-
-
-
-
-
-
-
- 10.2 Set Real Mode Interrupt Vector
-
-
- This function sets the value of the current task's real
- mode interrupt vector for the specified interrupt.
-
- To Call
-
- AX = 0201h
- BL = Interrupt number
- CX:DX = Segment:Offset of real mode interrupt handler
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o The address passed in CX must be a real mode
- segment, not a selector.
- o If the interrupt being hooked is a hardware
- interrupt then you must lock the segment that the
- interrupt handler runs in as well as any memory
- the handler may touch at interrupt time.
- o The address contained in CX:DX must be a real mode
- segment:offset, not a selector:offset. This means
- that the code for the interrupt handler must
- either reside in DOS addressable memory or you
- must use a real mode call-back address. Refer to
- the section on DOS memory management services on
- page 43 for information on allocating memory below
- 1 megabyte. Information on real mode call back
- addresses can be found on page 68.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 49
-
-
-
-
-
-
-
-
-
- 10.3 Get Processor Exception Handler Vector
-
-
- This function returns the CS:(E)IP of the current
- protected mode exception handler for the specified
- exception number.
-
- To Call
-
- AX = 0202h
- BL = Exception/fault number (00h-1Fh)
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- CX:(E)DX = Selector:Offset of exception handler
-
- If function was not successful:
- Carry flag is set.
- The value passed in BL was invalid.
-
- Programmer's Notes
-
- o The value returned in CX is a valid protected mode
- selector, not a real mode segment.
- o 32-bit mode programs will be returned a 32-bit
- offset in the EDX register.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 50
-
-
-
-
-
-
-
-
-
- 10.4 Set Processor Exception Handler Vector
-
-
- This function allows protected mode applications to
- intercept processor exceptions that are not handled by
- the DPMI environment. Programs may wish to handle
- exceptions such as not present segment faults which
- would otherwise generate a fatal error.
-
- Every exception is first examined by the protected mode
- operating system. If it can not handle the exception
- it then reflects it through the protected mode
- exception handler chain. The final handler in the
- chain may either reflect the exception as an interrupt
- (as would happen in real mode) or it may terminate the
- current program.
-
-
- To Call
-
- AX = 0203h
- BL = Exception/fault number (00h-1Fh)
- CX:(E)DX = Selector:Offset of exception handler
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
- The value passed in BL was invalid.
-
- Programmer's Notes
-
- o The value passed in CX must be a valid protected
- mode code selector, not a real mode segment.
- o 32-bit mode programs must supply a 32-bit offset
- in the EDX register. If your handler chains to
- the next exception handler it must do so using a
- 32-bit interrupt stack frame.
- o The handler should return using a far return
- instruction. The original SS:(E)SP, CS:(E)IP and
- flags on the stack, including the interrupt flag,
- will be restored.
- o All fault stack frames have an error code.
- However, the error code is only valid for
- exceptions 08h, 0Ah, 0Bh, 0Ch, 0Dh, and 0Eh.
- o The handler must preserve and restore all
- registers.
- o The exception handler will be called on a locked
- stack with interrupts disabled. The original SS,
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 51
-
-
-
-
-
-
-
-
- (E)SP, CS, and (E)IP will be pushed on the
- exception handler stack frame.
- o The handler must either return from the call by
- executing a far return or jump to the next handler
- in the chain (which will execute a far return or
- chain to the next handler).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 52
-
-
-
-
-
-
-
-
- o The procedure can modify any of the values on the
- stack pertaining to the exception before
- returning. This can be used, for example, to jump
- to a procedure by modifying the CS:IP on the
- stack. Note that the procedure must not modify
- the far return address on the stack -- it must
- return to the original caller. The caller will
- then restore the flags, CS:(E)IP and SS:(E)SP from
- the stack frame.
- o If the DPMI client does not handle an exception,
- or jumps to the default exception handler, the
- host will reflect the exception as an interrupt
- for exceptions 0, 1, 2, 3, 4, 5, and 7.
- Exceptions 6, and 8-1Fh will be treated as fatal
- errors and the client will be terminated.
- o Exception handlers will only be called for
- exceptions that occur in protected mode.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 53
-
-
-
-
-
-
-
-
- Call-Back Stack Frames
-
- Stack frame for 16-bit programs:
-
- 15 0
-
-
- SS
-
- SP
-
- Flags
-
- CS
-
- IP
-
- Err Code
-
-
- Return
- CS
-
- Return
- IP
-
- <-- SS:SP
-
- Stack frame for 32-bit programs:
-
- 31 0
-
-
- SS
-
-
- ESP
-
- EFlags
-
- CS
-
-
-
- EIP
-
-
- Error Code
-
- Ret CS
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 54
-
-
-
-
-
-
-
-
-
- Return EIP
-
-
- <-- SS:ESP
-
- Shaded fields should not be modified. Other fields can
- be modified before returning from the exception
- handler.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 55
-
-
-
-
-
-
-
-
-
- 10.5 Get Protected Mode Interrupt Vector
-
-
- This function returns the CS:(E)IP of the current
- protected mode interrupt handler for the specified
- interrupt number.
-
- To Call
-
- AX = 0204h
- BL = Interrupt number
-
- Returns
-
- Carry flag is clear.
- CX:(E)DX = Selector:Offset of exception handler
-
- Programmer's Notes
-
- o The value returned in CX is a valid protected mode
- selector, not a real mode segment.
- o 32-bit mode programs will be returned a 32-bit
- offset in the EDX register.
- o All 100h (256 decimal) interrupt vectors must be
- supported by the DPMI host.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 56
-
-
-
-
-
-
-
-
-
- 10.6 Set Protected Mode Interrupt Vector
-
-
- This function sets the address of the specified
- protected mode interrupt vector.
-
- To Call
-
- AX = 0205h
- BL = Interrupt number
- CX:(E)DX = Selector:Offset of exception handler
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o The value passed in CX must be a valid protected
- mode code selector, not a real mode segment.
- o 32-bit mode programs must supply a 32-bit offset
- in the EDX register. If your handler chains to
- the next exception handler it must do so using a
- 32-bit interrupt stack frame.
- o Note all 100h (256 decimal) interrupt vectors must
- be supported by the DPMI host.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 57
-
-
-
-
-
-
-
-
-
- 11. TRANSLATION SERVICES
-
-
- These services are provided so that protected mode programs
- can call real mode software that DPMI does not support
- directly. The protected mode program sets up a data
- structure that contains the values for every register. The
- data structure is defined as:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 58
-
-
-
-
-
-
-
-
-
- Offset Register
-
- 00h EDI
-
- 04h ESI
-
- 08h EBP
-
- 0Ch Reserved by system
-
- 10h EBX
-
- 14h EDX
-
- 18h ECX
-
- 1Ch EAX
-
-
- 20h Flags
-
-
- 22h ES
-
-
- 24h DS
-
-
- 26h FS
-
-
- 28h GS
-
-
- 2Ah IP
-
-
- 2Ch CS
-
-
- 2Eh SP
-
-
- 30h SS
-
-
-
- You will notice that all of the fields are dwords so that 32
- bit registers can be passed to real mode. Most real mode
- software will ignore the high word of the extended
- registers. However, you can write a real mode procedure
- that uses 32-bit registers if you desire. Note that 16-bit
- DPMI implementations may not pass the high word of 32-bit
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 59
-
-
-
-
-
-
-
-
- registers or the FS and GS segment registers to real mode
- even when running on an 80386 machine.
-
- Any interrupt handler or procedure called must return with
- the stack in the same state as when it was called. This
- means that the real mode code may switch stacks while it is
- running but it must return on the same stack that it was
- called on and it must pop off the entire far return/iret
- structure.
-
- After the call or interrupt is complete, all real mode
- registers and flags except SS, SP, CS, and IP will be copied
- back to the real mode call structure so that the caller can
- examine the real mode return values.
-
- Remember that the values in the segment registers should be
- real mode segments, not protected mode selectors.
-
- The translation services will provide a real mode stack if
- the SS:SP fields are zero. However, the stack provided is
- relatively small. If the real mode procedure/interrupt
- routine uses more than 30 words of stack space then you
- should provide your own real mode stack.
-
- It is possible to pass parameters to real mode software on
- the stack. The following code will call a real mode
- procedure with 3 word parameters:
-
-
- Protected_Mode_Code:
- push Param1
- push Param2
- push Param3
- (Set ES:DI to point to call structure)
- mov cx, 3 ; Copy 3 words
- mov ax, 0301h ; Call real mode proc
- int 31h ; Call the procedure
- add sp, 6 ; Clean up stack
-
- The real mode procedure would be called with the following
- data on the real mode stack:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 60
-
-
-
-
-
-
-
-
-
- Param1
-
- Param2
-
- Param3
-
- Return
- CS
-
-
- Return
- IP
-
- <-- Real mode SS:SP
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 61
-
-
-
-
-
-
-
-
- If your program needs to perform a series of calls to a real
- mode API it is sometimes more convenient to use the
- translation services to call a real mode procedure in your
- own program. That procedure can then issue the API calls in
- real mode and then return to protected mode. This also
- avoids the overhead of a mode switch for each API call.
-
- There is also a mechanism for protected mode software to
- gain control from real mode via a real mode call-back
- address. Real mode call-backs can be used to hook real mode
- interrupts or to be called in protected mode by a real mode
- driver. For example, many mouse drivers will call a
- specified address whenever the mouse is moved. This service
- allows the call-back to be handled by software running in
- protected mode.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 62
-
-
-
-
-
-
-
-
-
- 11.1 Simulate Real Mode Interrupt
-
-
- This function simulates an interrupt in real mode. It
- will invoke the CS:IP specified by the real mode
- interrupt vector and the handler must return by
- executing an iret.
-
- To Call
-
- AX = 0300h
- BL = Interrupt number
- BH = Flags
- Bit 0 = 1 resets the interrupt controller and A20
- line
- Other flags reserved and must be 0
- CX = Number of words to copy from protected mode to
- real mode stack
- ES:(E)DI = Selector:Offset of real mode call structure
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- ES:(E)DI = Selector:Offset of modified real mode call
- structure
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o The CS:IP in the real mode call structure is
- ignored by this service. The appropriate
- interrupt handler will be called based on the
- value passed in BL.
- o If the SS:SP fields are zero then a real mode
- stack will be provided by the DPMI host.
- Otherwise, the real mode SS:SP will be set to the
- specified values before the interrupt handler is
- called.
- o The flags specified in the real mode call
- structure will be pushed on the real mode stack
- iret frame. The interrupt handler will be called
- with the interrupt and trace flags clear.
- o When the Int 31h returns, the real mode call
- register structure will contain the values that
- were returned by the real mode interrupt handler.
- o It is up to the caller to remove any parameters
- that were pushed on the protected mode stack.
- o 32-bit programs must use ES:EDI to point to the
- real mode call structure. 16-bit programs should
- use ES:DI.
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 63
-
-
-
-
-
-
-
-
- o The flag to reset the interrupt controller and A20
- line is ignored by DPMI implementations that run
- in Virtual 8086 mode. It causes DPMI
- implementations that return to real mode to set
- the interrupt controller and A20 address line
- hardware to its normal real mode state.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 64
-
-
-
-
-
-
-
-
-
- 11.2 Call Real Mode Procedure With Far Return Frame
-
-
- This function calls a real mode procedure. The called
- procedure must execute a far return when it completes.
-
- To Call
-
- AX = 0301h
- BH = Flags
- Bit 0 = 1 resets the interrupt controller and A20
- line
- Other flags reserved and must be 0
- CX = Number of words to copy from protected mode to
- real mode stack
- ES:(E)DI = Selector:Offset of real mode call structure
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- ES:(E)DI = Selector:Offset of modified real mode call
- structure
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o The CS:IP in the real mode call structure
- specifies the address of the real mode procedure
- to call.
- o The real mode procedure must execute a far return
- when it has completed.
- o If the SS:SP fields are zero then a real mode
- stack will be provided by the DPMI host.
- Otherwise, the real mode SS:SP will be set to the
- specified values before the procedure is called.
- o When the Int 31h returns, the real mode call
- structure will contain the values that were
- returned by the real mode procedure.
- o It is up to the caller to remove any parameters
- that were pushed on the protected mode stack.
- o 32-bit programs must use ES:EDI to point to the
- real mode call structure. 16-bit programs should
- use ES:DI.
- o The flag to reset the interrupt controller and A20
- line is ignored by DPMI implementations that run
- in Virtual 8086 mode. It causes DPMI
- implementations that return to real mode to set
- the interrupt controller and A20 address line
- hardware to its normal real mode state.
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 65
-
-
-
-
-
-
-
-
-
- 11.3 Call Real Mode Procedure With Iret Frame
-
-
- This function calls a real mode procedure. The called
- procedure must execute an iret when it completes.
-
- To Call
-
- AX = 0302h
- BH = Flags
- Bit 0 = 1 resets the interrupt controller and A20
- line
- Other flags reserved and must be 0
- CX = Number of words to copy from protected mode to
- real mode stack
- ES:(E)DI = Selector:Offset of real mode call structure
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- ES:(E)DI = Selector:Offset of modified real mode call
- structure
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o The CS:IP in the real mode call structure
- specifies the address of the real mode procedure
- to call.
- o The real mode procedure must execute an iret when
- it has completed.
- o If the SS:SP fields are zero then a real mode
- stack will be provided by the DPMI host.
- Otherwise, the real mode SS:SP will be set to the
- specified values before the procedure is called.
- o When the Int 31h returns, the real mode call
- structure will contain the values that were
- returned by the real mode procedure.
- o The flags specified in the real mode call
- structure will be pushed the real mode stack iret
- frame. The procedure will be called with the
- interrupt and trace flags clear.
- o It is up to the caller to remove any parameters
- that were pushed on the protected mode stack.
- o 32-bit programs must use ES:EDI to point to the
- real mode call structure. 16-bit programs should
- use ES:DI.
- o The flag to reset the interrupt controller and A20
- line is ignored by DPMI implementations that run
- in Virtual 8086 mode. It causes DPMI
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 66
-
-
-
-
-
-
-
-
- implementations that return to real mode to set
- the interrupt controller and A20 address line
- hardware to its normal real mode state.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 67
-
-
-
-
-
-
-
-
-
- 11.4 Allocate Real Mode Call-Back Address
-
-
- This service is used to obtain a unique real mode
- SEG:OFFSET that will transfer control from real mode to
- a protected mode procedure.
-
- At times it is necessary to hook a real mode interrupt
- or device call-back in a protected mode driver. For
- example, many mouse drivers call an address whenever
- the mouse is moved. Software running in protected mode
- can use a real mode call-back to intercept the mouse
- driver calls.
-
- To Call
-
- AX = 0303h
- DS:(E)SI = Selector:Offset of procedure to call
- ES:(E)DI = Selector:Offset of real mode call structure
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- CX:DX = Segment:Offset of real mode call address
-
- If function was not successful:
- Carry flag is set.
-
- Call-Back Procedure Parameters
-
- Interrupts disabled
- DS:(E)SI = Selector:Offset of real mode SS:SP
- ES:(E)DI = Selector:Offset of real mode call structure
- SS:(E)SP = Locked protected mode API stack
- All other registers undefined
-
- Return from Call-Back Procedure
-
- Execute an IRET to return
- ES:(E)DI = Selector:Offset of real mode call structure
- to restore (see note)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 68
-
-
-
-
-
-
-
-
- Programmer's Notes
-
- o Since the real mode call structure is static, you
- must be careful when writing code that may be
- reentered. The simplest method of avoiding
- reentrancy is to leave interrupts disabled
- throughout the entire call. However, if the
- amount of code executed by the call-back is large
- then you will need to copy the real mode call
- structure into another buffer. You can then
- return with ES:(E)DI pointing to the buffer you
- copied the data to -- it does not have to point to
- the original real mode call structure.
- o The called procedure is responsible for modifying
- the real mode CS:IP before returning. If the real
- mode CS:IP is left unchanged then the real mode
- call-back will be executed immediately and your
- procedure will be called again. Normally you will
- want to pop a return address off of the real mode
- stack and place it in the real mode CS:IP. The
- example code in the next section demonstrates
- chaining to another interrupt handler and
- simulating a real mode iret.
- o To return values to the real mode caller you must
- modify the real mode call structure.
- o Remember that all segment values in the real mode
- call structure will contain real mode segments,
- not selectors. If you need to examine data
- pointed to by a real mode seg:offset pointer you
- should not use the segment to selector service to
- create a new selector. Instead, allocate a
- descriptor during initialization and change the
- descriptor's base to 16 times the real mode
- segment's value. This is important since
- selectors allocated though the segment to selector
- service can never be freed.
- o DPMI hosts should provide a minimum of 16 call-
- back addresses per task.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 69
-
-
-
-
-
-
-
-
- Example Code
-
- The following code is a sample of a real mode interrupt
- hook. It hooks the DOS Int 21h and returns an error
- for the delete file function (AH=41h). Other calls are
- passed through to DOS. This example is somewhat silly
- but it demonstrates the techniques used to hook a real
- mode interrupt. Note that since DOS calls are
- reflected from protected mode to real mode, the
- following code will intercept all DOS calls from both
- real mode and protected mode.
-
- ;******************************************************
- ; This procedure gets the current Int 21h real mode
- ; Seg:Offset, allocates a real mode call-back address,
- ; and sets the real mode Int 21h vector to the call-
- ; back address.
- ;******************************************************
- Initialization_Code:
- ;
- ; Create a code segment alias to save data in
- ;
- mov ax, 000Ah
- mov bx, cs
- int 31h
- jc ERROR
- mov ds, ax
- ASSUMES DS,_TEXT
- ;
- ; Get current Int 21h real mode SEG:OFFSET
- ;
- mov ax, 0200h
- mov bl, 21h
- int 31h
- jc ERROR
- mov [Orig_Real_Seg], cx
- mov [Orig_Real_Offset], dx
- ;
- ; Allocate a real mode call-back
- ;
- mov ax, 0303h
- push ds
- mov bx, cs
- mov ds, bx
- mov si, OFFSET My_Int_21_Hook
- pop es
- mov di, OFFSET My_Real_Mode_Call_Struc
- int 31h
- jc ERROR
- ;
- ; Hook real mode int 21h with the call-back address
- ;
- mov ax, 0201h
- mov bl, 21h
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 70
-
-
-
-
-
-
-
-
- int 31h
- jc ERROR
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 71
-
-
-
-
-
-
-
-
- ;******************************************************
- ;
- ; This is the actual Int 21h hook code. It will return
- ; an "access denied" error for all calls made in real
- ; mode to delete a file. Other calls will be passed
- ; through to DOS.
- ;
- ; ENTRY:
- ; DS:SI -> Real mode SS:SP
- ; ES:DI -> Real mode call structure
- ; Interrupts disabled
- ;
- ; EXIT:
- ; ES:DI -> Real mode call structure
- ;
- ;******************************************************
-
- My_Int_21_Hook:
- cmp es:[di.RealMode_AH], 41h
- jne Chain_To_DOS
- ;
- ; This is a delete file call (AH=41h). Simulate an
- ; iret on the real mode stack, set the real mode
- ; carry flag, and set the real mode AX to 5 to indicate
- ; an access denied error.
- ;
- cld
- lodsw ; Get real mode ret IP
- mov es:[di.RealMode_IP], ax
- lodsw ; Get real mode ret CS
- mov es:[di.RealMode_CS], ax
- lodsw ; Get real mode flags
- or ax, 1 ; Set carry flag
- mov es:[di.RealMode_Flags], ax
- add es:[di.RealMode_SP], 6
- mov es:[di.RealMode_AX], 5
- jmp My_Hook_Exit
- ;
- ; Chain to original Int 21h vector by replacing the
- ; real mode CS:IP with the original Seg:Offset.
- ;
- Chain_To_DOS:
- mov ax, cs:[Orig_Real_Seg]
- mov es:[di.RealMode_CS], ax
- mov ax, cs:[Orig_Real_Offset]
- mov es:[di.RealMode_IP], ax
-
- My_Hook_Exit:
- iret
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 72
-
-
-
-
-
-
-
-
-
- 11.5 Free Real Mode Call-Back Address
-
-
-
- This function frees a real mode call-back address that
- was allocated through the allocate real mode call-back
- address service.
-
- To Call
-
- AX = 0304h
- CX:DX = Real mode call-back address to free
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o Real mode call-backs are a limited resource. Your
- code should free any break point that it is no
- longer using.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 73
-
-
-
-
-
-
-
-
-
- 11.6 Get State Save/Restore Addresses
-
-
- When a program uses the raw mode switch services (see
- page 77) or issues DOS calls from a hardware interrupt
- handler, it will need to save the state of the current
- task before changing modes. This service returns the
- addresses of two procedures used to save the state of
- the current task's registers. For example, the real
- mode address is used to save the state of the protected
- mode registers. The protected mode address is used to
- save the state of the real mode registers. This can be
- used to save the state of the alternate mode's
- registers before they are modified by the mode switch
- call. The current mode's registers can be saved by
- simply pushing them on the stack.
-
- Note: It is not necessary to call this service if
- using the translation services 0300h, 0301h or 0302h.
- It is provided for programs that use the raw mode
- switch service.
-
- To Call
-
- AX = 0305h
-
- Returns
-
- If function was successful:
- Carry flag is clear
- AX = Size of buffer in bytes required to save state
- BX:CX = Real mode address used to save/restore state
- SI:(E)DI = Protected mode address used to save/restore
- state
-
- If function was not successful:
- Carry flag is set
-
- Parameters To State-Save Procedures
-
- Execute a far call to the appropriate address (real or
- pmode) with:
- ES:(E)DI = Pointer to state-save buffer
- AL = 0 to save state
- AL = 1 to restore state
-
- Programmer's Notes
-
- o Some implementations of DPMI will not require the
- state to be saved. In this case, the buffer size
- returned will be zero. However, it is still valid
- to call the addresses returned, although they will
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 74
-
-
-
-
-
-
-
-
- just return without performing any useful
- function.
- o The save/restore functions will not modify any
- registers.
- o The address returned in BX:CX must only be called
- in real mode. The address returned in SI:(E)DI
- must only be called in protected mode.
- o 16-bit programs should call the address returned
- in SI:DI to save the real mode state. 32-bit
- programs should call the address returned in
- SI:EDI.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 75
-
-
-
-
-
-
-
-
- Example Code
-
- The following code is a sample protected mode timer
- interrupt handler that saves the state of the real mode
- registers, issues DOS calls, and restores the state.
- This code assumes that the Int 31h function 0305h has
- been executed and that the call address and buffer size
- have been saved in local variables.
-
- Sample_Timer_Code:
- pushf
- call FAR PTR cs:[Next_Timer_Handler]
- sti
- ;
- ; Save protected mode registers
- ;
- push ds
- push es
- pusha
- ;
- ; Save real mode registers
- ;
- mov ds, cs:[My_Local_DS]
- mov ax, ss
- mov es, ax
- sub sp, [State_Save_Size]
- mov di, sp
- xor al, al
- call [PM_Save_Restore_State]
-
- ;
- ; Raw mode switch here
- ;
- .
- .
- .
- ;
- ; Restore real mode registers
- ;
- mov ax, ss
- mov es, ax
- mov di, sp
- mov al, 1
- call [PM_Save_Restore_State]
- add sp, [State_Save_Size]
- ;
- ; Restore protected mode registers and return
- ;
- popa
- pop es
- pop ds
-
- iret
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 76
-
-
-
-
-
-
-
-
-
- 11.7 Get Raw Mode Switch Addresses
-
-
-
-
- This function returns addresses that can be jumped to
- for low-level mode switching.To Call
-
- AX = 0306h
-
- Returns
-
- If function was successful:
- Carry flag is clear
- BX:CX = Real -> Protected mode switch address
- SI:(E)DI = Protected -> Real mode switch address
-
- If function was not successful:
- Carry flag is set
-
- Parameters To State-Save Procedures
-
- Execute a far jump to the appropriate address (real or
- pmode) with:
- AX = New DS
- CX = New ES
- DX = New SS
- (E)BX = New (E)SP
- SI = New CS
- (E)DI = New (E)IP
-
- The processor will be placed in the desired mode. The
- DS, ES, SS, (E)SP, CS, and (E)IP will contain the
- values specified. The (E)BP register will be preserved
- across the call and so can be used as a pointer. The
- values in (E)AX, (E)BX, (E)CX, (E)DX, (E)SI, and (E)DI
- will be undefined. On an 80386 or 80486 the FS and GS
- segment registers will contain zero after the mode
- switch.
-
- Programmer's Notes
-
- o The address returned in BX:CX must only be called
- in real mode to switch into protected mode. The
- address returned in SI:(E)DI must only be called
- in protected mode to switch into real mode.
- o 16-bit programs should call the address returned
- in SI:DI to switch from protected to real mode.
- 32-bit programs should call the address returned
- in SI:EDI.
- o It is up to the caller to save and restore the
- state of the task when using this function to
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 77
-
-
-
-
-
-
-
-
- switch modes. This usually requires using the
- state save function (see page 74).
- o The parameters must contain segment values
- appropriate for the mode that is being switched
- to. If invalid selectors are specified when
- switching into protected mode, an exception will
- occur.
- o Applications may find functions 0300h, 0301h,
- 0302h, and 0304h more convenient to use than using
- this type of mode switching.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 78
-
-
-
-
-
-
-
-
-
- 12. GET VERSION
-
-
- Function 0400h returns the version of DPMI services
- supported. Note that this is not necessarily the version of
- any operating system that supports DPMI. It should be used
- by programs to determine what calls are legal in the current
- environment.
-
- To Call
-
- AX = 0400h
-
- Returns
-
- AH = Major version
- AL = Minor version
- BX = Flags
- Bit 0 = 1 if running under an 80386 DPMI
- implementation
- Bit 1 = 1 if processor is returned to real mode
- for reflected interrupts (as opposed to Virtual
- 8086 mode).
- Bit 2 = 1 if virtual memory is supported
- Bit 3 is reserved and undefined
- All other bits are zero and reserved for later use
- CL = Processor type
- 02 = 80286
- 03 = 80386
- 04 = 80486
- DH = Current value of virtual master PIC base interrupt
- DL = Current value of virtual slave PIC base interrupt
- Carry flag clear (call can not fail)
-
- Programmer's Notes
-
- None
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 79
-
-
-
-
-
-
-
-
-
- 13. MEMORY MANAGEMENT SERVICES
-
-
- These functions are provided to allocate linear address
- space.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 80
-
-
-
-
-
-
-
-
-
- 13.1 Get Free Memory Information
-
-
- This function is provided so that protected mode
- applications can determine how much memory is
- available. Under DPMI implementations that support
- virtual memory, it is important to consider issues such
- as the amount of available physical memory.
-
- Note that since DPMI applications will often run in
- multi-tasking environments, this function must be
- considered only advisory.
-
- To Call
-
- AX = 0500h
- ES:(E)DI = Selector:Offset of 30h byte buffer
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- ES:(E)DI = Selector:Offset of buffer with the following
- structure:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 81
-
-
-
-
-
-
-
-
-
- Offset Description
-
- 00h Largest available free block in
- bytes
-
- 04h Maximum unlocked page allocation
-
- 08h Maximum locked page allocation
-
- 0Ch Linear addr space size in pages
-
- 10h Total number of unlocked pages
-
- 14h Number of free pages
-
- 18h Total number of physical pages
-
- 1Ch Free linear address space in pages
-
- 20h Size of paging file/partition in
- pages
-
-
-
-
- 24h-2Fh Reserved
-
-
-
-
-
- If function was not successful:
- Carry flag is set.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 82
-
-
-
-
-
-
-
-
- Programmer's Notes
-
- o 32-bit programs must use ES:EDI to point to the
- buffer. 16-bit programs should use ES:DI.
- o DPMI implementations that do not support virtual
- memory (returned in flags from Get Version call)
- will only fill in the first field. This value
- specifies that largest allocation that could be
- made using function 0501h. Other fields will be
- set to -1.
- o Only the first field of this structure is
- guaranteed to contain a valid value. All fields
- that are not returned by the DPMI implementation
- will be set to -1 (0FFFFFFFFh) to indicate that
- the information is not available.
- o The field at offset 00h specifies the largest
- block of contiguous linear memory in bytes that
- could be allocated if the memory were to be
- allocated and left unlocked.
- o The field at offset 04h specifies the number of
- pages that could be allocated. This is the value
- returned by field 00h / page size.
- o The field at offset 08h specifies the largest
- block of memory in pages that could be allocated
- and then locked.
- o The field at offset 0Ch specifies the size of the
- total linear address space in pages. This
- includes all linear address space that has already
- been allocated.
- o The field at offset 10h specifies the total number
- of pages that are currently unlocked and could be
- paged out. This value also contains any free
- pages.
- o The field at offset 14h specifies the number of
- physical pages that currently are not in use.
- o The field at offset 18h specifies the total number
- of physical pages that the DPMI host manages.
- This value includes all free, locked, and unlocked
- physical pages.
- o The field at offset 20h specifies the size of the
- DPMI host's paging partition or file in pages.
- o To determine the size of pages for the DPMI host
- call the Get Page Size service (see page 93).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 83
-
-
-
-
-
-
-
-
-
- 13.2 Allocate Memory Block
-
-
- This function allocates and commits linear memory.
-
- To Call
-
- AX = 0501h
- BX:CX = Size of memory block to allocate in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear
- BX:CX = Linear address of allocated memory block
- SI:DI = Memory block handle (used to resize and free)
-
- If function was unsuccessful:
- Carry flag is set
-
- Programmer's Notes
-
- o This function does not allocate any selectors for
- the memory block. It is the responsibility of the
- caller to allocate and initialize any selectors
- needed to access the memory.
- o Under DPMI implementations that support virtual
- memory the memory block will be allocated
- unlocked. If some or all of the memory should be
- locked you will need to use either the lock
- selector function or the lock linear region
- function.
- o Under many implementations of DPMI, allocations
- will be page granular. This means that an
- allocation of 1001h bytes will result in an
- allocation of 2000h bytes. Therefore it is best
- to always allocate memory in multiples of 4K.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 84
-
-
-
-
-
-
-
-
-
- 13.3 Free Memory Block
-
-
- This function frees a memory block that was allocate
- through the allocate memory block function.
-
- To Call
-
- AX = 0502h
- SI:DI = Handle of memory block to free
-
- Returns
-
- If function was successful:
- Carry flag is clear
-
- If function was unsuccessful:
- Carry flag is set
-
- Programmer's Notes
-
- o Your program must also free any selectors that it
- allocated to point to the memory block.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 85
-
-
-
-
-
-
-
-
-
- 13.4 Resize Memory Block
-
-
- This function changes the size of a memory block that
- was allocated through the allocate memory block
- function.
-
- To Call
-
- AX = 0503h
- BX:CX = New size of memory block to allocate in bytes
- SI:DI = Handle of memory block to resize
-
- Returns
-
- If function was successful:
- Carry flag is clear
- BX:CX = New linear address of memory block
- SI:DI = New handle of memory block
-
- If function was unsuccessful:
- Carry flag is set
-
- Programmer's Notes
-
- o This function may change the linear address of the
- memory block and the memory handle. Therefore,
- you will need to update any selectors that point
- to the block after resizing it. You must use the
- new handle instead of the old one.
- o This function will generate an error if a memory
- block is resized to 0 bytes.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 86
-
-
-
-
-
-
-
-
-
- 14. PAGE LOCKING SERVICES
-
-
- These services are only useful under DPMI implementations
- that support virtual memory. They will be ignored by 16-bit
- DPMI implementations (although they will always return with
- carry clear to indicate success).
-
- Some implementations of DPMI may ignore these calls.
- However, if the calls are ignored then the DPMI host will be
- able to handle page faults at arbitrary points during the
- application's execution including interrupt and exception
- handler code.
-
- Although memory ranges are specified in bytes, the actual
- unit of memory that will be locked will be one or more
- pages. Page locks are maintained as a count. When the
- count is decremented to zero, the page is unlocked and can
- be swapped to disk. This means that if a region of memory
- is locked three times then it must be unlocked three times
- before the pages will be unlocked.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 87
-
-
-
-
-
-
-
-
-
- 14.1 Lock Linear Region
-
-
- This function locks a specified linear address range.
-
- To Call
-
- AX = 0600h
- BX:CX = Starting linear address of memory to lock
- SI:DI = Size of region to lock in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o If this function fails then none of the memory
- will be locked.
- o If the specified region overlaps part of a page at
- the beginning or end of the region, the page(s)
- will be locked.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 88
-
-
-
-
-
-
-
-
-
- 14.2 Unlock Linear Region
-
-
- This function unlocks a specified linear address range
- that was previously locked using the Lock Linear Region
- function.
-
- To Call
-
- AX = 0601h
- BX:CX = Starting linear address of memory to unlock
- SI:DI = Size of region to unlock in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o If this function fails then none of the memory
- will be unlocked.
- o An error will be returned if the memory was not
- previously locked or if the specified region is
- invalid.
- o If the specified region overlaps part of a page at
- the beginning or end of the region, the page(s)
- will be unlocked.
- o Even if the function succeeds, the memory will
- remain locked if the lock count is not decremented
- to zero.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 89
-
-
-
-
-
-
-
-
-
- 14.3 Mark Real Mode Region as Pageable
-
-
- Under some implementations of DPMI, all memory in
- virtual 8086 mode is locked by default. If a protected
- mode program is using memory in the first megabyte of
- address space, it is a good idea to use this function
- to turn off automatic page locking for regions of
- memory that will not be touched at interrupt time.
-
- Do not mark memory as pageable in regions that are not
- owned by your application. For example, you should not
- mark all free DOS memory as pageable since it may cause
- a page fault to occur while inside of DOS (causing a
- crash). Also, do not mark the DPMI host data area as
- pageable.
-
- It is very important to relock any real mode memory
- using function 0603h before terminating a program.
- Memory that remains unlocked after a program has
- terminated could result in fatal page faults when other
- software is executed in that address space.
-
- Note that address space marked as pageable by this
- function can be locked using function 0600h. This
- function is just an advisory service to allow memory
- that does not need to be locked to be paged out. This
- function just disables any automatic locking of real
- mode memory performed by the DPMI host.
-
- To Call
-
- AX = 0602h
- BX:CX = Starting linear address of memory to mark as
- pageable
- SI:DI = Size of region to page in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o If this function fails then none of the memory
- will be unlocked.
- o If the specified region overlaps part of a page at
- the beginning or end of the region, the page(s)
- will be not be marked as pageable.
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 90
-
-
-
-
-
-
-
-
- o When your program terminates it should call
- function 0603h to relock the memory region.
- o Unlike the lock and unlock calls, the pageability
- of the real mode region is maintained as a binary
- state, not a count. Therefore, do not call this
- function multiple times for a given linear region.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 91
-
-
-
-
-
-
-
-
-
- 14.4 Relock Real Mode Region
-
-
- This function is used to relock memory regions that
- were marked as pageable by the previous function.
-
- To Call
-
- AX = 0603h
- BX:CX = Starting linear address of memory to relock
- SI:DI = Size of region to page in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o If this function fails then none of the memory
- will be relocked.
- o If the specified region overlaps part of a page at
- the beginning or end of the region, the page(s)
- will be not be relocked.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 92
-
-
-
-
-
-
-
-
-
- 14.5 Get Page Size
-
-
- This function returns the size of a single memory page
- in bytes.
-
- To Call
-
- AX = 0604h
-
- Returns
-
- If function was successful:
- Carry flag is clear
- BX:CX = Page size in bytes
-
- If function was not successful:
- Carry flag is set
-
- Programmers Notes
-
- None
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 93
-
-
-
-
-
-
-
-
-
- 15. DEMAND PAGING PERFORMANCE TUNING SERVICES
-
-
- Some applications will discard memory objects or will not
- access objects for long periods of time. These services can
- be used to improve the performance of demand paging.
-
- Although these functions are only relevant for DPMI
- implementations that support virtual memory, other
- implementations will ignore these functions (it will always
- return carry clear). Therefore your code can always call
- these functions regardless of the environment it is running
- under.
-
- Since both of these functions are simply advisory functions,
- the operating system may choose to ignore them. In any
- case, your code should function properly even if the
- functions fail.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 94
-
-
-
-
-
-
-
-
-
- 15.1 Reserved Subfunctions
-
-
- Functions 0700h and 0701h are reserved and should not
- be called.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 95
-
-
-
-
-
-
-
-
-
- 15.2 Mark Page as Demand Paging Candidate
-
-
- This function is used to inform the operating system
- that a range of pages should be placed at the head of
- the page out candidate list. This will force these
- pages to be swapped to disk ahead of other pages even
- if the memory has been accessed recently. However, all
- memory contents will be preserved.
-
- This is useful, for example, if a program knows that a
- given piece of data will not be accessed for a long
- period of time. That data is ideal for swapping to
- disk since the physical memory it now occupies can be
- used for other purposes.
-
- To Call
-
- AX = 0702h
- BX:CX = Starting linear address of pages to mark
- SI:DI = Number of bytes to mark as paging candidates
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o This function does not force the pages to be
- swapped to disk immediately.
- o Partial pages will not be discarded.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 96
-
-
-
-
-
-
-
-
-
- 15.3 Discard Page Contents
-
-
- This function discards the entire contents of a given
- linear memory range. It is used after a memory object
- that occupied a given piece of memory has been
- discarded.
-
- The contents of the region will be undefined the next
- time the memory is accessed. All values previously
- stored in this memory will be lost.
-
- To Call
-
- AX = 0703h
- BX:CX = Starting linear address of pages to discard
- SI:DI = Number of bytes to discard
-
- Returns
-
- If function was successful:
- Carry flag is clear.
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o Partial pages will not be discarded.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 97
-
-
-
-
-
-
-
-
-
- 16. PHYSICAL ADDRESS MAPPING
-
-
- Memory mapped devices such as network adapters and displays
- sometimes have memory mapped at physical addresses that lie
- outside of the normal 1Mb of memory that is addressable in
- real mode. Under many implementations of DPMI, all
- addresses are linear addresses since they use the paging
- mechanism of the 80386. This service can be used by device
- drivers to convert a physical address into a linear address.
- The linear address can then be used to access the device
- memory.
-
- Some implementations of DPMI may not support this call
- because it could be used to circumvent system protection.
- This call should only be used by programs that absolutely
- require direct access to a memory mapped device.
-
- To Call
-
- AX = 0800h
- BX:CX = Physical address of memory
- SI:DI = Size of region to map in bytes
-
- Returns
-
- If function was successful:
- Carry flag is clear.
- BX:CX = Linear address that can be used to access the
- physical memory
-
- If function was not successful:
- Carry flag is set.
-
- Programmer's Notes
-
- o Under DPMI implementations that do not use the
- 80386 paging mechanism, the function will always
- succeed and the address returned will be equal to
- the physical address parameter passed into this
- function.
- o It is up to the caller to build an appropriate
- selector to access the memory.
- o Do not use this service to access memory that is
- mapped in the first megabyte of address space (the
- real mode addressable region).
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 98
-
-
-
-
-
-
-
-
-
- 17. VIRTUAL INTERRUPT STATE FUNCTIONS
-
-
- Under many implementations of DPMI, the interrupt flag in
- protected mode will always be set (interrupts enabled).
- This is because the program is running under a protected
- operating system that can not allow programs to disable
- physical hardware interrupts. However, the operating system
- will maintain a "virtual" interrupt state for protected mode
- programs. When the program executes a cli instruction, the
- program's virtual interrupt state will be disabled, and the
- program will not receive any hardware interrupts until it
- executes an sti to reenable interrupts (or calls service
- 0901h).
-
- When a protected mode program executes a pushf instruction,
- the real processor flags will be pushed onto the stack.
- Thus, examining the flags pushed on the stack is not
- sufficient to determine the state of the program's virtual
- interrupt flag. These services enable programs to get and
- modify the state of their virtual interrupt flag.
-
- The following sample code enters an interrupt critical
- section and then restores the virtual interrupt state to
- it's previous state.
-
- ;
- ; Disable interrupts and get previous interrupt state
- ;
- mov ax, 0900h
- int 31h
- ;
- ; At this point AX = 0900h or 0901h
- ;
- .
- .
- .
- ;
- ; Restore previous state (assumes AX unchanged)
- ;
- int 31h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 99
-
-
-
-
-
-
-
-
-
- 17.1 Get and Disable Virtual Interrupt State
-
-
- This function will disable the virtual interrupt flag
- and return the previous state of the virtual interrupt
- flag.
-
- To Call
-
- AX = 0900h
-
- Returns
-
- Carry flag clear (this function always succeeds)
- Virtual interrupts are disabled
- AL = 0 if virtual interrupts were previously disabled
- AL = 1 if virtual interrupts were previously enabled
-
- Programmer's Notes
-
- o AH will not be changed by this procedure.
- Therefore, to restore the previous state, simply
- execute an Int 31h.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 100
-
-
-
-
-
-
-
-
-
- 17.2 Get and Enable Virtual Interrupt State
-
-
- This function will enable the virtual interrupt flag
- and return the previous state of the virtual interrupt
- flag.
-
- To Call
-
- AX = 0901h
-
- Returns
-
- Carry flag clear (this function always succeeds)
- Virtual interrupts are enabled
- AL = 0 if virtual interrupts were previously disabled
- AL = 1 if virtual interrupts were previously enabled
-
- Programmer's Notes
-
- o AH will not be changed by this procedure.
- Therefore, to restore the previous state, simply
- execute an Int 31h.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 101
-
-
-
-
-
-
-
-
-
- 17.3 Get Virtual Interrupt State
-
-
- This function will return the current state of the
- virtual interrupt flag.
-
- To Call
-
- AX = 0902h
-
- Returns
-
- Carry flag clear (this function always succeeds)
- AL = 0 if virtual interrupts are disabled
- AL = 1 if virtual interrupts are enabled
-
- Programmer's Notes
-
- None
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 102
-
-
-
-
-
-
-
-
-
- 18. GET VENDOR SPECIFIC API ENTRY POINT
-
-
- Some DOS extenders provide extensions to the standard set of
- DPMI calls. This call is used to obtain an address which
- must be called to use the extensions. The caller points
- DS:(E)SI to a null terminated string that specifies the
- vendor name or some other unique identifier to obtain the
- specific extension entry point.
-
- To Call
-
- AX = 0A00h
- DS:(E)SI = Pointer to null terminated string
-
- Returns
-
- If function was successful:
- Carry flag is clear
- ES:(E)DI = Extended API entry point
- DS, FS, GS, EAX, EBX, ECX, EDX, ESI, and EBP may be
- modified
-
- If function was not successful:
- Carry flag is set
-
- Programmer's Notes
-
- o Execute a far call to call the API entry point.
- o All extended API parameters are specified by the
- vendor.
- o The string comparison used to return the API entry
- point is case sensitive.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 103
-
-
-
-
-
-
-
-
-
- 19. DEBUG REGISTER SUPPORT
-
-
- The 80386 processor supports special registers that are used
- for debugging. Since the instructions to modify these
- registers can only be executed by code running at privileged
- level zero, protected mode debuggers running in DPMI
- environments can not modify the registers directly. These
- services provide mechanisms for setting and clearing debug
- watchpoints and detecting when a watchpoint has caused a
- fault.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 104
-
-
-
-
-
-
-
-
-
- 19.1 Set Debug Watchpoint
-
-
- This function will set a debug watchpoint at a
- specified linear address.
-
- To Call
-
- AX = 0B00h
- BX:CX = Linear address of watchpoint
- DL = Size of watchpoint (1, 2, or 4)
- DH = Type of watchpoint
- 0 = Execute
- 1 = Write
- 2 = Read/Write
-
- Returns
-
- If function was successful:
- Carry flag is clear
- BX = Debug watchpoint handle
-
- If function was not successful:
- Carry flag is set
-
- Programmer's Notes
-
- None
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 105
-
-
-
-
-
-
-
-
-
- 19.2 Clear Debug Watchpoint
-
-
- This function will clear a debug watchpoint that was
- set using the Set Debug Watchpoint function.
-
- To Call
-
- AX = 0B01h
- BX = Debug watchpoint handle
-
- Returns
-
- If function was successful:
- Carry flag is clear
-
- If function was not successful:
- Carry flag is set
-
- Programmer's Notes
-
- o This call frees the debug watchpoint handle
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 106
-
-
-
-
-
-
-
-
-
- 19.3 Get State of Debug Watchpoint
-
-
- This function returns the state of a debug watchpoint
- that was set using the Set Debug Watchpoint function.
-
- To Call
-
- AX = 0B02h
- BX = Debug Watchpoint Handle
-
- Returns
-
- If function was successful:
- Carry flag is clear
- AX = Status flags
- Bit 0 = 1 if watch point has been executed
-
- If function was not successful:
- Carry flag is set
-
- Programmer's Notes
-
- o To clear the watchpoint state the caller must use
- function 0B03h.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 107
-
-
-
-
-
-
-
-
-
- 19.4 Reset Debug Watchpoint
-
-
- This function resets the state of a previously defined
- debug watchpoint.
-
- To Call
-
- AX = 0B03h
- BX = Debug Watchpoint Handle
-
- Returns
-
- If function was successful:
- Carry flag is clear
-
- If function was not successful:
- Carry flag is set
-
- Programmer's Notes
-
- None
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 108
-
-
-
-
-
-
-
-
-
- 20. OTHER APIS
-
-
- In general, any software interrupt interface that passes
- parameters in the EAX, EBX, ECX, EDX, ESI, EDI, and EBP
- registers will work as long as none of the registers
- contains a segment value. In other words, if a software
- interrupt interface is completely register based without any
- pointers, segment register, or stack parameters, that API
- could work under any DPMI implementation.
-
- More complex APIs require the caller to use the translation
- services described on page 58.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 109
-
-
-
-
-
-
-
-
-
- 21. NOTES FOR DOS EXTENDERS
-
-
- Many programs that use DPMI will be bound to DOS extenders
- so that they will be able to run under any DOS environment.
- Existing DOS extenders support APIs that differ from the Int
- 31h interface. Usually, DOS extenders use an Int 21h
- multiplex for their extended APIs.
-
- Extenders that support DPMI will need to initialize
- differently when they are run under DPMI environments. They
- will need to enter protected mode using the DPMI real to
- protected mode entry point, install their own API handlers,
- and then load the DOS extended application program.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 110
-
-
-
-
-
-
-
-
-
- 21.1 Initialization of Extenders
-
-
- DOS extenders should check for the presence of DPMI before
- attempting to allocate memory or enter protected mode using
- any other API. DOS extenders should check for APIs in the
- following order:
-
- DOS Protected Mode Interface
- Virtual Control Program Interface
- eXtended Memory Specification
- Int 15h memory allocation
-
- When DPMI services are detected, extenders that provide
- interfaces that extend or are different from the basic DPMI
- interface will switch into protected mode and initialize any
- internal data structures. DPMI compatible extenders that
- provide no API extensions should simply execute the
- protected mode application in real mode.
-
-
-
-
- 21.2 Installing API Extensions
-
-
- DOS extenders typically use Int 21h to implement API
- extensions. Under DPMI, a DOS extender will need to install
- an API translation library by hooking Int 21h via then get
- and set protected mode interrupt vector functions (see page
- 56). The DOS extender library then gets to see every DOS
- call executed by the application program. If the API does
- not have any pointers then the interrupt can be reflected to
- the original interrupt handler. The default handler will
- pass the interrupt to real mode. Other APIs can be
- explicitly mapped by the DOS extender.
-
- WARNING: The translation library code should be in locked
- memory to prevent page faults while DOS is in a critical
- section. This could happen, for instance, if a program
- called DOS reentrantly from an Int 24h (critical error).
-
-
-
-
- 21.3 Loading the Application Program
-
-
- Once the API translation library has been initialized, the
- DOS extender can load the application program using standard
- DOS calls. Memory should be allocated using the DPMI memory
- allocation services.
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 111
-
-
-
-
-
-
-
-
-
- 21.4 Providing API Extensions
-
-
- DPMI call 0A00h provides a standard mechanism for providing
- vendor specific extensions to the standard APIs. To support
- extensions under a DPMI environment, the translation library
- should hook the Int 31h chain (using the DOS get/set vector
- calls) and watch for call 0A00h. When this call is issued
- with the proper string parameter, the Int 31h hook code
- should modify ES:(E)DI, clear the carry flag on the stack,
- and iret without passing the call down the Int 31h chain.
- If the string passed in ES:(E)DI does not match the
- extensions supported by the library then the call should be
- passed down the Int 31h chain.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- July 26, 1990 DOS PROTECTED MODE INTERFACE SPECIFICATION 0.9 Page 112
-
-
-